package arquitetura.model;

import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;

import conexao.Conexao;
import conexao.ConexaoImpl;
import to.Cliente;
import exceptions.*;

import to.Locacao;


public class ModelLocacaoImpl implements ModelLocacao {
	private Conexao conexao;
    
    public ModelLocacaoImpl(){
        conexao = ConexaoImpl.getInstancia();
    }

    @Override
    public void incluir(Locacao locacao) throws ConexaoException, ModelException {
        Connection conex = conexao.conectar();
        int ultimoCodigo = conexao.ultimoCodigo("Locacao");
        
        String sql = "INSERT INTO LOCACAO (codigo, cliente, data_Locacao, data_Prevista) VALUES(?,?,?,?)";
        
        //converte o formato Date do java para o formato Date do sql
        java.sql.Date sqlDataLocacao = new java.sql.Date(locacao.getDataLocacao().getTime());
        java.sql.Date sqlDataPrevista = new java.sql.Date(locacao.getDataPrevista().getTime());
        
        try{
            PreparedStatement pstm = conex.prepareStatement(sql);
            pstm.setInt(1, ultimoCodigo + 1);
            pstm.setInt(2, locacao.getCliente().getCodigo());
            pstm.setDate(3, sqlDataLocacao);
            pstm.setDate(4, sqlDataPrevista);
            pstm.executeUpdate();
            pstm.close();            
        }catch(SQLException e){
            throw new ModelException(e.getMessage());
        }finally{
            conexao.desconectar(conex);
        }
    }
    
    public void alterar(Locacao locacao) throws ConexaoException, ModelException{		
		Connection conex = conexao.conectar();
		java.sql.Date sqlDataPrevista = new java.sql.Date(locacao.getDataPrevista().getTime());
		
	    String sql = "UPDATE Locacao SET data_prevista=?" + 
	    			 "WHERE codigo=?";
	    try {
	        PreparedStatement pstm = conex.prepareStatement(sql);
	        pstm.setDate(1, sqlDataPrevista);        
	        pstm.setInt(2, locacao.getCodigo());
	        pstm.executeUpdate();
	        pstm.close();
	    } catch (SQLException e) {
	        throw new ModelException(e.getMessage());
	    }finally{
	    	conexao.desconectar(conex);
	    }
	}

    public void excluir(int codigo)throws ConexaoException, ModelException{		
		Connection conex = conexao.conectar();		
		String sql = "DELETE FROM Locacao WHERE codigo=?";
		
		try{
			PreparedStatement pstm = conex.prepareStatement(sql);
            pstm.setInt(1, codigo);
            pstm.executeUpdate();
            pstm.close();
        } catch (SQLException e) {
            throw new ModelException(e.getMessage());
        }finally{
        	conexao.desconectar(conex);
        }
	}
    
    public Locacao consultar(int codigo) throws ConexaoException, ModelException {
        Locacao locacao = null;
        Connection conex = conexao.conectar();
        
        String sql = "SELECT codigo, cliente, data_locacao, data_prevista  FROM locacao WHERE codigo=?";

        try{
            PreparedStatement pstm = conex.prepareStatement(sql);
            pstm.setInt(1, codigo);
            ResultSet rs = pstm.executeQuery();

            if(rs.next()){
            	Cliente cliente = new Cliente();
            	cliente.setCodigo(rs.getInt("cliente"));
            	
                locacao = new Locacao();
                locacao.setCodigo(rs.getInt("codigo"));
                locacao.setCliente(cliente);
                locacao.setDataLocacao(rs.getDate("data_locacao"));
                locacao.setDataPrevista(rs.getDate("data_prevista"));
            }
            
        }catch(SQLException e){
            throw new ModelException(e.getMessage());
            
        }finally{
            conexao.desconectar(conex);
        }
        return locacao;
    }

    @Override
    public Collection<String[]> listarParaGrid(String parteDoNome) throws ConexaoException, ModelException {
    	Collection<String[]> lista = new ArrayList<String[]>();
    	
        Connection conex = conexao.conectar();
        
        String sql = "SELECT codigo, cliente, data_locacao, data_prevista  FROM locacao";
        //VER ISSO AQUI
        if (! parteDoNome.trim().equals(""))
			sql = sql + "WHERE data_locacao like \"%" + parteDoNome + "%\" ";
		
		sql = sql + "ORDER BY data_locacao";
        try{
        	PreparedStatement stm = conex.prepareStatement(sql);
            ResultSet rs = stm.executeQuery(sql);
            
            while( rs.next() ){              
                lista.add(new String[] {rs.getString("codigo"), rs.getString("cliente"), rs.getString("data_locacao"), 
										rs.getString("data_prevista")});
            }
            return lista;
        }catch(SQLException e){
            throw new ModelException(e);
        }finally{
           conexao.desconectar(conex);
        }
    }
    
    
    public int diferencaDiasData(String dataPrevista, String dataEntrega) throws ModelException, ParseException {  
        int diferenca = 0;
        try {  
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");  
            java.util.Date dataPrevistaFormatada = dateFormat.parse(dataPrevista);  
            java.util.Date dataEntregaFormatada = dateFormat.parse(dataEntrega);  
            diferenca = (int) ((dataEntregaFormatada.getTime() - dataPrevistaFormatada.getTime())/86400000);
        } catch (ParseException e) {
	        throw new ModelException(e.getMessage());
	    }         
        return diferenca;
    }
    
    
    public void devolucao(Locacao locacao) throws ConexaoException, ModelException{
       Connection conex = conexao.conectar();
       String sql;
       java.sql.Date sqlDataDevolucao = new java.sql.Date(locacao.getDataEntrega().getTime());
       
       sql = "UPDATE LOCACAO SET data_entrega=? WHERE (codigo=?)";
       try {
            PreparedStatement pstm = conex.prepareStatement(sql);
            pstm.setDate(1, sqlDataDevolucao);
            pstm.setInt(2, locacao.getCodigo());
            pstm.executeUpdate();
            pstm.close();
        } catch (SQLException ex) {
            throw new ModelException();
        }finally{
            conexao.desconectar(conex);
        }
    }    
}

